/*
 * 代号：凤凰
 * http://www.jphenix.org
 * 2019年1月16日
 * V4.0
 */
package com.jphenix.servlet.parent;

import com.jphenix.standard.docs.BeanInfo;
import com.jphenix.standard.docs.ClassInfo;
import com.jphenix.standard.docs.Register;
import com.jphenix.standard.threadpool.ICrontabBean;

/**
 * 定时任务类父类
 * 
 * import com.jphenix.servlet.parent.CrontabBeanParent;
 * 
 * 2019-01-24 将该类迁移到单独包中
 * 2019-01-25 修改了类注释
 * 2020-01-07 增加了是否执行该定时任务的开关
 * 
 * @author 马宝刚
 */
@ClassInfo({"2020-01-07 09:41","定时任务元素父类"})
@Register({"crontab_service"})
@BeanInfo({"crontabbeanparent","true","","定时任务元素父类"})
public class CrontabBeanParent extends ServiceBeanParent implements ICrontabBean {
	
	private boolean isEnabled = true; //是否允许指定定时任务（默认允许）
	
    /**
     * 构造函数
     */
    public CrontabBeanParent() {
        super();
    }
    
    /**
     * 是否允许执行该定时任务
     * @return 是否允许执行该定时任务
     * 2020年1月7日
     * @author MBG
     */
    public boolean enabled() {
    	return isEnabled;
    }

    /**
     * 设置是否允许指定该定时任务
     * @param isEnabled 是否允许指定该定时任务
     * 2020年1月7日
     * @author MBG
     */
    public void enabled(boolean isEnabled) {
    	this.isEnabled = isEnabled;
    }
    
    /**
     * 获取定时间隔时间信息
     * @return 定时间隔时间信息
     * 2014年10月20日
     * @author 马宝刚
     */
    @Override
    public String getTimeInfo() {
        /* * 
         * 
         * 最新定时格式：（具体请看CrontabVO类注释）
         * 
         * 特点：兼容Linux的Crontab格式，也采纳了Spring定时格式的优点，去掉其缺点。
         * Spring定时格式的缺点：周定义， 1为周日（欧洲标准）。而我们认为1为周一，7为周日（中国，美国，ISO标准）
         *                       复杂，定时时间容易让人产生误解。比如：日期设置为5W，即当月离第五个日期最近的工作
         *                       有可能小于当月第五个日期，有可能大于第五个日期。还有很少用到的关键字C。在设计定时
         *                       字符串时，不知道该用到*还是?（有时用*和用?都行）
         *                       
         * 于是我们本着不能将就用的原则，自己写了个定时任务。
         * 
         * 规则如下：
         * 
         * 
         * 如果分为5段信息
         * * * * * *
         * 则每段含义为： 分 时 日 月 周
         * 
         * 如果分为6段信息
         * 则每段含义为： 秒 分 时 日 月 周
         * 
         * 如果分为7段信息
         * 则每段含义为： 秒 分 时 日 月 周 年
         * 如果需要用到年，必须有秒信息，如果没有用到秒，则用 * 占位
         * 年很少用得到，但开发成本低，一顺手就加上了
         * 
         * 每个分段描述说明：
         * 
         *    *  星号：代表未设置。比如这种情况 * 10 * * *  每天10点执行，但是没设置分值（严格讲，这是错误的），分钟
         *             默认为0
         *             
         *    数值   ：
         *             秒、分钟、小时：0~59   
         *             天            ：1~31（视具体月份而定） 
         *             月            ：1~12 
         *             周            ：0~7（注意：0、7都是周日，用哪个都行） 注意：ISO标准定义7为周日（一个周期最后一天），欧洲周日为1（不采纳）
         *             年            ：当前年份~无限大
         *             
         *    枚举   ：1,3,5,6  适用于 秒、分钟、小时、天、月、周。
         *    
         *    范围   ：1-5      适用于 秒、分钟、小时、天、月、周。
         * 
         *    单词缩写
         *    
         *          月份： Jan   Feb   Mar   Apr   May    Jun    Jul   Aug    Sept   Oct   Nov   Dec （不计大小写）
         *          
         *            周： Mon  Tue   Wed   Thur   Fri   Sat   Sun
         *            
         *    间隔循环： * /1  （注意：星号跟斜杠之间没有空格。这里只能带上空格，否则被认定为注释结束）
         *                      适用于 秒、分钟、小时、天、月、周、年
         *                      比如：用在分钟上，代表每一分钟执行一次 * /5 为每5分钟执行一次
         *                
         *               5 /1   组合信息，如果用在分钟上，代表从第5分钟开始，每分钟执行一次
         *              
         *               5-10 /1 如果用在日期上，意为：从5号到10号，每天执行一次
         *               
         *    末尾关键字L   适用于：天，星期。比如 30 10 5L * *  意为：每月倒数第五天得的10点半执行。
         *                  因为每个月的日期数量是不一样的，用这个关键字就方便多了。比如：30 10 * * 5L
         *                  意为：每个月最后一周的周五的10点半执行。
         *            
         *    末尾关键字W   代表工作日，仅适用于天。比如 * /1W 每个工作日执行一次
         *                                               10W   每月第十个工作日
         *                                               1WL   每个月最后一个工作日
         *                   注意：如果使用到了工作日，需要设置工作日序列或非工作日序列，否则程序无法判断指定日期是否为工作日
         *                   
         *                        如果这样设置  1,2,3  则包含了 3.   如果这样设置  1-3 实际上到2就结束了，不包含3，比如：
         *                        30 8-17 * * * 每天从早上8点开始，到晚上17点结束，每30分钟执行一次。  实际上到了16:59分以后，就不在执行了
         *                        也就是说，17点以后（包含17点）不再执行 （1-5 不包含末尾数值，这种方式仅适用于 小时、分、秒。 日、月、周、年，是包含末尾数值的）
         *                        
         *                        30 * * * * 与  * /30 * * * * 的区别（斜杠与前面的星号之间没有空格，这里带空格是因为避免被误认为注释结束）
         *                        前一种情况，30分整执行。 后一种情况，比如第一次执行时间为 50分，那么下一次执行时间为下一个小时的20分。
         *                   
         *  常用例子：
         *  
         *      30 08 * * *                每天的8点半执行
         *      30 08 * * 1-5              周一到周五，每天8点半执行
         *      30 08 * Jan,Feb,Mar        每一月份、二月份、三月份的每天8点半执行一次
         *      30 08 * * Tue              每周二的8点半执行一次
         *      * /5 08-10 * * *           每天8点到10点之间，每5分钟执行一次
         *      * /3 * * * * *             每三秒执行一次
         *      * /3 * 10 * * *            每天10点，每三秒执行一次
         *      * 00 09 1 1 * * /2         每两年的一月一号9点执行一次
         *      30 08 * * /1 5L            每个月最后一个周五的早上8点半执行
         *      0/5 20-23,0-8 * * *        每晚8点到第二天早上8点期间，每5分钟执行一次
         */
        return "* * * * *";
    }

    /**
     * 需要执行的方法
     * 2014年10月20日
     * @throws Exception 异常
     * @author 马宝刚
     */
    @Override
    public void run() throws Exception {
        //需要子类实现该方法
    }
}
